home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / t_os / cdp / cdp.c next >
Text File  |  1993-07-08  |  9KB  |  398 lines

  1. #define CONSOLE    1
  2. #define TEST 0
  3.  
  4. /*  /// CD-DA利用関数 ///  */
  5.  
  6. #include    <stdio.h>
  7. #include    <stdlib.h>
  8. #include    <cdrfrb.h>
  9. #include    <snd.h>
  10. #include    "cdp.h"
  11.  
  12. /*        グローバル変数        */
  13.  
  14. /* CD時間情報の構造体 TIMEADRS */
  15. struct    TIMEADRS    cdtim;            /* ディスク演奏終了時刻 */
  16. struct    TIMEADRS    trktim[99];        /* 各トラック毎の演奏開始時刻 */
  17.  
  18. int        devno = 0;    /* ドライブナンバ */
  19. int        cdtype = 0;        /* CDディスクタイプ */
  20. int        sttrk = 0;        /* 先頭曲ナンバ */
  21. int        endtrk = 0;        /* 最終曲ナンバ */
  22.  
  23. int        cdpstat = 10000;    /* CDplayステイタス
  24.     ( cdp.cの関数で管理し、ハード情報に直接依存しない)
  25.     (演奏 => 曲番号, 一時停止 => マイナス値 ,ディスク情報未取得    =>±10000 ) */
  26.  
  27. /*  cdr_mphase 関連  */
  28. int        stat = 0;            /* CD演奏(1)・非演奏(一時停止含む)(0) */
  29. int        nowmusno = 0;        /* 現在演奏中の曲番号 */
  30. struct    TIMEADRS    intrktim;    /* トラック内演奏時刻 */
  31. struct    TIMEADRS    indsktim;    /* ディスク内演奏時刻 */
  32.  
  33.  
  34. /* CDディスク情報の取得 */
  35.  
  36. int cdp_diskinf()
  37.     {
  38.     int        ret;
  39.     #if CONSOLE
  40.     printf("CDディスク情報を読み取ります\n");
  41.     #endif
  42.     ret = cdr_cdinfo( devno, &cdtype, &sttrk, &endtrk, trktim, &cdtim );
  43.     if( cdtype == 3 )
  44.         {    sttrk = 2;    }
  45.     if( ret == 0 )
  46.         {
  47.         cdpstat = 0;        /* 一度cdpstatの値を停止中扱いにする */
  48.         #if CONSOLE
  49.         printf("ディスクタイプ = %d\n", cdtype);
  50.         printf("先頭トラック(曲)番号 = %d\n", sttrk);
  51.         printf("最終トラック(曲)番号 = %d\n", endtrk);
  52.         printf("ディスク内演奏時間(分) = %d\n", cdtim.min);
  53.         printf("ディスク内演奏時間(秒) = %d\n", cdtim.sec);
  54.         printf("ディスク内演奏時間(フレーム) = %d\n", cdtim.frame);
  55.         #endif
  56.         }
  57.     #if CONSOLE
  58.     else
  59.         {
  60.         printf("エラーです!!ディスク情報が読めませんでした。\n");
  61.         }
  62.     #endif
  63.         return( ret );
  64.     }
  65.  
  66.  
  67. /* CD演奏状態読み取り */
  68.  
  69. int cdp_playinf()
  70.     {
  71.     int        ret;
  72.     ret = cdr_mphase( devno, &stat, &nowmusno, &intrktim, &indsktim );    
  73.     if( ret == CDERR7 )
  74.         {
  75.         if( stat == 0 )
  76.             {
  77.             cdp_diskinf();
  78.             }
  79.         else
  80.             {
  81.             cdpstat = 10000;
  82.             }
  83.         }
  84.     #if TEST
  85.     printf("cdst=%d ,mno=%d ,st=%d ,m/s/f=%d %d %d\n",
  86.         cdpstat, nowmusno, stat, intrktim.min, intrktim.sec, intrktim.frame);
  87.     #endif
  88.     return( ret );
  89.     }
  90.  
  91.  
  92.     /*  CD演奏 (開始)  */
  93.  
  94. void endtim(char,char,char,char *,char *,char *);
  95.  
  96. /* 演奏開始 (時刻指定) */
  97. int cdp_tstart( struct TIMEADRS begtim )
  98.     {                                        /* 終了時刻設定 */
  99.     int        ret;
  100.     struct TIMEADRS fintim;
  101.  
  102.     endtim( cdtim.min, cdtim.sec, cdtim.frame,
  103.             &fintim.min, &fintim.sec, &fintim.frame);
  104.     #if CONSOLE
  105.     printf(" FinTim = %d %d %d \n",fintim.min,fintim.sec,fintim.frame);
  106.     #endif
  107.     ret = cdr_mtplay( devno, &begtim, &fintim);    /* 演奏指令 */
  108.     if( ret == 0 )
  109.         {
  110.         cdp_playinf();
  111.         cdpstat = nowmusno; /* cdpstat値に曲番号を設定 */
  112.         }
  113.     #if CONSOLE
  114.     printf(" ret= 0x%x\n", ret);
  115.     #endif
  116.     return( ret );
  117.     }
  118.  
  119. /* 曲名指定 */
  120. int cdp_sstart( unsigned int song_num )
  121.     {
  122.     int        ret;
  123.     struct    TIMEADRS    sttim;            /* 演奏開始時刻 (命令用) */
  124.     struct    TIMEADRS    fintim;            /* 演奏終了時刻 (命令用) */
  125.  
  126.     if( (song_num<sttrk) || (endtrk<song_num) )
  127.         {        /* 存在しない曲番号の場合はキャンセルする */
  128.         #if CONSOLE
  129.         printf(" No. %u : この番号の曲は存在しません\n", song_num);
  130.         printf(" sttrk=%d song_num=%d endtrk=%d\n",sttrk,song_num,endtrk);
  131.         #endif
  132.         return(-1);
  133.         }
  134.     sttim.min = trktim[song_num-1].min;    /* 開始時刻設定 */
  135.     sttim.sec = trktim[song_num-1].sec;
  136.     sttim.frame = trktim[song_num-1].frame;
  137.     #if CONSOLE 
  138.     printf(" song_number = %d\n", song_num);
  139.     printf(" sttim = %d %d %d \n", sttim.min, sttim.sec, sttim.frame);
  140.     #endif
  141.     if( song_num <= endtrk )                /* 終了時刻設定 */
  142.         {
  143.         endtim( cdtim.min, cdtim.sec, cdtim.frame,
  144.                 &fintim.min, &fintim.sec, &fintim.frame);
  145.         #if CONSOLE
  146.         printf(" FinTim = %d %d %d \n",fintim.min,fintim.sec,fintim.frame);
  147.         #endif
  148.         }
  149.     else                            /*    終了時刻設定 (指定失敗の場合) */
  150.         {
  151.         #if CONSOLE
  152.         printf(" song_num > endtrk !! ");
  153.         #endif
  154.         return(-1);
  155.         }
  156.     ret = cdr_mtplay( devno, &sttim, &fintim);    /* 演奏指令 */
  157.     if( ret == 0 )
  158.         {
  159.         cdpstat = song_num; /* cdpstat値を曲番号に設定 */
  160.         }
  161.     #if CONSOLE
  162.     printf(" ret= 0x%x\n", ret);
  163.     #endif
  164.     return( ret );
  165.     }
  166.  
  167.     /* 演奏終了時刻計算 */
  168.     void endtim(char m, char s, char f, char *mi, char *se, char *fr)
  169.         {
  170.                         /* 1分は60秒 ,1秒は75フレーム */
  171.         int        a;
  172.  
  173.         a = 4500*m + 75*s + f -1;
  174.         *mi = a/4500;
  175.         *se = ( a%4500 )/75;
  176.         *fr = a%75;
  177.         }
  178.  
  179. /* 演奏開始 (局番絶対指定) */
  180. int cdp_go( unsigned int song_num ,char sw )
  181.     {
  182.     if( sw == 1 )         /* 演奏中割り込み可能指定の場合 */
  183.         {
  184.         if( stat == 1 ) {    cdr_pause( devno );    }
  185.  
  186.         if( abs(cdpstat) == 10000 )        /* ディスク情報を未取得の場合 */
  187.             {
  188.             cdp_diskinf();
  189.             }
  190.         }
  191.     int        ret;
  192.     #if CONSOLE
  193.     printf("\n cdp_GO !! Next One => %d\n", song_num);
  194.     #endif
  195.     ret = cdp_sstart( song_num ); /* cdpstatはcdp_sstartで設定 */
  196.     return( ret );
  197.     }
  198.  
  199. /* 演奏開始 (最初の曲) */
  200. int cdp_first_go()
  201.     {
  202.     int        ret = -1;
  203.     if( cdpstat == 0 ) /* 停止中の場合 */
  204.         {
  205.         #if CONSOLE
  206.         printf("\n cdp_FIRST() ! Next One => %d\n", sttrk);
  207.         #endif
  208.         ret = cdp_sstart( sttrk ); /* cdpstatはcdp_sstartで設定 */
  209.         }
  210.     else if( cdpstat < 0 ) /* 一時停止中の場合 */
  211.         {
  212.         ret = cdp_cont();
  213.         }
  214.     return( ret );
  215.     }
  216.  
  217. int cdp_stop()        /* 演奏中止 */
  218.     {
  219.     #if CONSOLE
  220.     printf("\n cdp_STOP() !\n");
  221.     #endif
  222.     int        ret;
  223.     ret = cdr_mstop( devno );
  224.     if( abs(cdpstat) == 10000 )        /* ディスク情報未取得の場合 */
  225.         {
  226.         ret = cdp_diskinf();
  227.         }
  228.     if( ret == 0 )                /* 正常動作した場合 */
  229.         {
  230.         cdpstat = 0;
  231.         }
  232.     return( ret );
  233.     }
  234.  
  235. /* 演奏中断 */
  236. int cdp_pause()
  237.     {
  238.     int        ret;
  239.     ret = cdr_pause( devno );
  240.     if( ret == 0 || ret == DEVPAUSE )    /* 正常に一時停止状態になった場合 */
  241.         {
  242.         if( ret == 0 )
  243.             {
  244.             cdpstat = -abs( cdpstat );    /* cdpstatを負の値にする */
  245.             #if CONSOLE
  246.             printf("\n cdp_PAUSE!!\n\n");
  247.             #endif
  248.             }
  249.         #if CONSOLE
  250.         else
  251.             {    printf("\n すでに演奏中断しています\n");    }
  252.         }
  253.     else if( ret != 0 )        /* エラーの場合 */
  254.         {
  255.         printf(" cdp_pause エラーしました No.= 0x%x\n", ret);
  256.         #endif
  257.         }
  258.     return( ret );
  259.     }
  260.  
  261. /* 演奏中断解除 */
  262. int cdp_cont()
  263.     {
  264.     int        ret;
  265.     ret = cdr_continue( devno );
  266.     if( ret == 0 || ret == DEVNPAUSE || ret == DEVPLY )
  267.         {
  268.         cdpstat = abs( cdpstat ); /* cdpstatの値を正にする */
  269.         #if CONSOLE
  270.         if( ret == 0 )
  271.             {
  272.             printf("\n cdp_CONTinue!!\n\n");
  273.             }
  274.         else
  275.             {    printf("\n 既に解除されています\n");    }
  276.         }
  277.     else
  278.         {
  279.         printf(" cdp_cont エラーしました Error No. = 0x%x\n", ret);
  280.         #endif
  281.         }
  282.     return( ret );
  283.     }
  284.  
  285. /* 演奏中断と解除 */
  286. int cdp_p_c()
  287.     {
  288.     int        ret = -1;
  289.     if( stat == 1 && cdpstat > 0 )
  290.         {    ret = cdp_pause();    }
  291.     else if( cdpstat < 0 )
  292.         {    ret = cdp_cont();    }
  293.     return( ret );
  294.     }
  295.  
  296. /* 演奏を次の曲に */
  297. int cdp_next()
  298.     {
  299.     int        ret, a ,b;
  300.     b = abs( cdpstat );
  301.  
  302.     if( stat == 1 ) {    cdr_pause( devno );    }
  303.  
  304.     if( b == 10000 )        /* ディスク情報を未取得の場合 */
  305.         {
  306.         cdpstat = nowmusno;
  307.         b = abs(cdpstat);
  308.         cdp_diskinf();
  309.         }
  310.         
  311.     if( cdtype == 3 && b == 0 )
  312.         {        /* DA-DATA共存ディスクでstop状態からコールされた時の処理 */
  313.         a = 2;
  314.         }
  315.     else if( b < endtrk )
  316.         {        /* 次の曲に送る */
  317.         a = b +1;
  318.         }
  319.     else if( b == endtrk )
  320.         {        /* 現在、最後の曲のときは先頭の曲にする */
  321.         a = sttrk;
  322.         }
  323.     else    /* 失敗 */
  324.         {
  325.         #if CONSOLE
  326.         printf(" Song_num > Endtrk !!\n");
  327.         #endif
  328.         return(-1);
  329.         }
  330.     #if CONSOLE
  331.     printf("\n cdp_NEXT() ! Next One => %d\n", a);
  332.     #endif
  333.     ret = cdp_sstart( a ); /* cdpstatはcdp_sstartで設定 */
  334.     return( ret );
  335.     }
  336.  
  337. /* 演奏を前に戻す */
  338. int cdp_back()
  339.     {
  340.     int        ret, a, b;
  341.     b = abs( cdpstat );
  342.  
  343.     if( stat == 1 ) {    cdr_pause( devno );    }
  344.     if( b == 10000 )        /* ディスク情報を未取得の場合 */
  345.         {
  346.         cdpstat = nowmusno;
  347.         b = abs(cdpstat);
  348.         cdp_diskinf();
  349.         }
  350.  
  351.     if( intrktim.sec < 2 && cdpstat > 0 )
  352.         {        /* 2秒以内演奏中のときは前の曲を指定する */
  353.         if( sttrk < b )
  354.             {    a = b -1; }
  355.         else if( sttrk == b )
  356.             {    /* 現在、最初の曲のときは最後の曲を指定する */
  357.             a = endtrk;
  358.             }
  359.         }
  360.     else if( sttrk <= b )
  361.         {        /* 曲の始めに戻す (曲途中・一時停止中) */
  362.         a = b;
  363.         }
  364.     else if( b == 0 )
  365.         {        /* 停止中の場合は最後の曲を指定する */
  366.         a = endtrk;
  367.         }
  368.     else
  369.         {
  370.         #if CONSOLE
  371.         printf(" Error @ cdp_back() !!\n");
  372.         #endif
  373.         return(-1);
  374.         }
  375.     #if CONSOLE
  376.     printf("\n cdp_BACK() ! Next One => %d\n", a);
  377.     #endif
  378.     ret = cdp_sstart( a ); /* cdpstatはcdp_sstartで設定 */
  379.     return( ret );
  380.     }
  381.  
  382. /* 1曲の演奏が終わったら勝手に次の曲に設定を書き換える */
  383. int cdp_inf_next()
  384.     {
  385.     int        ret = -1;
  386.     ret = cdp_playinf();
  387.  
  388.     if( cdpstat <= 0 || cdpstat == 10000)    /* 停止中だったら何もしない */
  389.         {    return( ret );    }
  390.  
  391.     if( stat == 0 || cdpstat != nowmusno )    /* 前の曲が終わった場合 */
  392.         {
  393.         ret = cdp_next(); /* 変数cdpstatはcdp_sstartで設定 */
  394.         }
  395.     return( ret );
  396.     }
  397.  
  398.